%% Poblacion Inicial Genetico
Poblacionnicial = 0.5e5;  % 10% del universo de posibilidades (186e6)
poblacion = InitialPopulationRandom_3comb8(Poblacionnicial,tablacombinaciones_ind,tablacombinaciones_comb);

fprintf('Poblacion Inicial Creada \n');
save('poblacionInicial_8Combinando.mat','poblacion','Poblacionnicial');
%Elapsed time is 220.088928 seconds. en 10e6 ---4  min


%% Limpieza
clear inicioDD
clear output_balance
clear percent_win
clear ratio
clear tablaResultados
clear DDactual
clear beneficio
clear beneficio12meses
clear draw_max

%% Poda Inicial sistemas
poblaciontraducida(:,1:5)=uint16(tablacombinaciones_comb(poblacion(:,1),1:5));
poblaciontraducida(:,6)=uint16(tablacombinaciones_ind(poblacion(:,2),1));
poblaciontraducida(:,7)=uint16(tablacombinaciones_ind(poblacion(:,3),1));
poblaciontraducida(:,8)=uint16(tablacombinaciones_ind(poblacion(:,4),1));

outputPoblacionInicial=zeros(1,Poblacionnicial,'single');
parfor i=1:Poblacionnicial
output= outputSistemas(poblaciontraducida(i,:),tabladatos_ind);
outputPoblacionInicial(i)=output(end);
end

%recta de 45
maximoBenefinicial=max(outputPoblacionInicial(:));
minimoBenefinicial=min(outputPoblacionInicial(:));
longitud=length(tabladatos_ind(:,1));%numero de diasverticalmaximo = (maximoBenefi-minimoBenefi)/2;%beneficio
%verticalmaximo = (maximoBenefinicial-minimoBenefinicial)/2;%beneficio
verticalmaximo= mean(outputPoblacionInicial);

salto=verticalmaximo/(longitud);
recta=zeros(longitud,1);
recta(1:longitud)=1:salto:verticalmaximo;
%Poda de <45
filaseliminar=0;
recta=recta(end);
%poda
outputPoblacionPodada=outputPoblacionInicial;
parfor i=1:Poblacionnicial
    
if outputPoblacionInicial(i)>recta 
    %outputPoblacionPodada(:,i)=outputSistemas(poblaciontraducida(i,:),tabladatos_ind);%slecciona 485 sistemas
%     hold on
else
    outputPoblacionPodada(i)=0;
    %filaseliminar=[i filaseliminar];%elimino esa fila de la matriz de poblacion
end
end
%plot(recta(:,1),'--r','LineWidth',2);
%close all
filaseliminar=find(outputPoblacionPodada(:)==0);
filaseliminar=flipud(filaseliminar);%de mayor a menor
poblacionpodada=poblacion;
poblacionpodada(filaseliminar(:,1),:)=[];%elimina esas filas


Poblacionnicialpodada= length(poblacionpodada(:,1));%Poblacion inicial Final PODADA

fprintf('Poblacion Inicial Podada \n');
fprintf('Se poda la poblacion inicial a %i \n',Poblacionnicialpodada);
save('poblacionPodada_6Combinando.mat','poblacionpodada','Poblacionnicialpodada');

%% Datos Entrada GA
nvars=4;
numeroSistemas1=length(tablacombinaciones_comb(:,1));%5
numeroSistemas2=length(tablacombinaciones_ind(:,1));%1
ub=[numeroSistemas1 numeroSistemas2 numeroSistemas2 numeroSistemas2];
lb=[1 1 1 1];
PopulationSize_Data=Poblacionnicialpodada+round(Poblacionnicialpodada*0.5);%el 50% aleatorio
EliteCount_Data=round(Poblacionnicialpodada*0.05);%Inidividuos que pasan a la siguiente generacion,los mejores
Generations_Data=1000;%numero maximo de generaciones
StallGenLimit_Data=20;%numero maximo de generaciones sin mejorar
TolFun_Data=1e-12;%Tolerancia
%load('bestultima4.mat');
InitialPopulation_Data=[double(poblacionpodada)];
%fitness=@(sistema)fitnessfuntion_combinando7(sistema,tablacombinaciones_comb,tablacombinaciones_ind,tabladatos_ind);
const=[1 2 3 4];
% Clear
clear poblacion
%clear poblacionpodada
clear poblaciontraducida
clear outputPoblacionInicial
clear outputPoblacionPodada
fprintf('Opciones GA Hechas \n');
%matlabpool('close');
%% Start with the default options
% options = gaoptimset;
% % Modify options setting
% options = gaoptimset(options,'PopulationSize', PopulationSize_Data);
% options = gaoptimset(options,'EliteCount', EliteCount_Data);
% options = gaoptimset(options,'Generations', Generations_Data);
% options = gaoptimset(options,'StallGenLimit', StallGenLimit_Data);
% options = gaoptimset(options,'TolFun', TolFun_Data);
% options = gaoptimset(options,'InitialPopulation', InitialPopulation_Data);
% options = gaoptimset(options,'Display', 'iter');
% options = gaoptimset(options,'UseParallel', 'always');%para usar todos los nucleos
% %options = gaoptimset(options,'Vectorized', 'on');%para vectorizar
% options = gaoptimset(options,'PlotFcns', {  @gaplotbestf @gaplotdistance });
% [x,fval,exitflag,output,population,score] = ...   
% ga(fitness,nvars,[],[],[],[],lb,ub,[],const,options);
% %save('bestultima4.mat','x'); 
% save('SalidaGA7Combinando.mat','x','fval','exitflag','output','population','score');
%%  Clear
clear poblacion
%clear poblacionpodada
clear poblaciontraducida
clear outputPoblacionInicial
clear outputPoblacionPodada
fprintf('Opciones GA Hechas \n');
%matlabpool('close');
% %% Start with the default options - one fitness
% options = gaoptimset;
% % Modify options setting
% options = gaoptimset(options,'PopulationSize', PopulationSize_Data);
% options = gaoptimset(options,'EliteCount', EliteCount_Data);
% options = gaoptimset(options,'Generations', Generations_Data);
% options = gaoptimset(options,'StallGenLimit', StallGenLimit_Data);
% options = gaoptimset(options,'TolFun', TolFun_Data);
% options = gaoptimset(options,'InitialPopulation', InitialPopulation_Data);
% options = gaoptimset(options,'Display', 'iter');
% options = gaoptimset(options,'UseParallel', 'always');%para usar todos los nucleos
% %options = gaoptimset(options,'Vectorized', 'on');%para vectorizar
% options = gaoptimset(options,'PlotFcns', {  @gaplotbestf @gaplotdistance });
% [x,fval,exitflag,output,population,score] = ...   
% ga(fitness,nvars,[],[],[],[],lb,ub,[],const,options);
% %save('bestultima4.mat','x'); 
% save('SalidaGA6Combinando.mat','x','fval','exitflag','output','population','score');
%% Multifitness
FitnessFunction = @(sistema)multifitnessfuntion_combinando8(sistema,tablacombinaciones_comb,tablacombinaciones_ind,tabladatos_ind); % Function handle to the fitness function

A = []; b = []; % No linear inequality constraints
Aeq = []; beq = []; % No linear equality constraints
options = gaoptimset;
options = gaoptimset('PlotFcns',@gaplotpareto);
options = gaoptimset(options,'PopulationSize', round(PopulationSize_Data/5));
options = gaoptimset(options,'EliteCount', EliteCount_Data);
options = gaoptimset(options,'Generations', Generations_Data);
options = gaoptimset(options,'StallGenLimit', StallGenLimit_Data);
options = gaoptimset(options,'TolFun', TolFun_Data);
options = gaoptimset(options,'InitialPopulation', InitialPopulation_Data);
options = gaoptimset(options,'Display', 'iter');
options = gaoptimset(options,'UseParallel', 'always');%para usar todos los nucleos

[x,fval,exitFlag,output] = gamultiobj(FitnessFunction,nvars,A, ...
    b,Aeq,beq,lb,ub,options);

fprintf('The number of points on the Pareto front was: %d\n', size(x,1));
fprintf('The number of generations was : %d\n', output.generations);
save('SalidaGA8CombinandoMulti.mat','x','fval','exitFlag','output');
